// 存储登录人信息
import { loginAPI, getUserInfoAPI, getUserDetailById } from '@/api/user.js'
// 导入持久化方法
// * as 自己命名 可导入文件向外导出的所有方法，之后用 这个名字. 即可使用某个方法
import * as auth from '@/utils/auth.js'
// console.log(auth)

import { resetRouter } from '@/router'

export default {
  // 开启命名空间（模块化）
  namespaced: true,
  // 定义数据变量【全局共享】（和组件data类似【私有】）
  // ***相同点：数据都是响应式的（数据驱动试图）
  state: {
    // 默认从本地获取一次token（获取上一次存储的token）
    token: auth.getToken() || '',
    // 当前登录人信息
    userInfo: {}
  },
  // 修改 state 定义的变量（只能通过它修改）
  // 特点：同步
  mutations: {
    /**
     * 存token
     * @param {*} state 定义数据变量
     * @param {*} newToken 调用updateToken方法传入要存储的token
     */
    updateToken (state, newToken) {
      // 内存和硬盘都存一份
      state.token = newToken
      auth.setToken(newToken)
    },
    /**
     *
     * @param {*} 删除token
     */
    delToken (state) {
      state.token = ''
      auth.removeToken()
    },
    /**
     *
     * @param {*} state
     * @param {*} userinfo 调用 setUserInfo 传入的用户信息数据
     */
    setUserInfo (state, userinfo) {
      state.userInfo = userinfo
    },
    /**
     * 清空登录人信息
     * @param {*} state
     */
    delUserInfo (state) {
      state.userInfo = {}
    }
  },
  // 获取后台数据的方法
  // 特点：异步
  actions: {
    /**
     *
     * @param {*} ctx:object {commit}
     * @param {*} loginForm 登录表单数据 {mobile,password}
     */
    // ctx 解构成 { commit }，里面有commit、dispatch等方法
    async getTokenAction ({ commit }, loginForm) {
      // 1. 调用登录接口获取token
      const res = await loginAPI(loginForm)
      console.log('校验成功', res)
      // 2. 调用mutations方法updateToken存储
      commit('updateToken', res)
    },
    async getUserInfoAction ({ commit }) {
      // 调用获取用户信息接口
      // 1. 获取登录人信息
      const user = await getUserInfoAPI()
      // console.log(user)
      commit('setUserInfo', user)
      const photo = await getUserDetailById(user.userId)
      commit('setUserInfo', { ...user, ...photo })
      // 返回数据=》外边调用，可以通过.then或者await获取
      // return 的值相当于resolve(值)
      return user.roles
    },
    /**
     * 退出登录，删除token和登录人信息
     * @param {*} param0
     */
    logoutAction ({ commit }) {
      commit('delToken')
      commit('delUserInfo')
      // 1. 重置路由，避免缓存
      resetRouter()
      // 2. 清除菜单数据，只留下静态路由的数据
      // 说明：跨模块调用=》第三个参数必须传入{ root: true }
      commit('menu/setList', [], { root: true })
    }
  }
}
